package org.an.proj.contacts.ui.test;

import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import me.drakeet.materialdialog.MaterialDialog;
import org.an.ku.util.ToastUtil;
import org.an.proj.contacts.R;
import org.an.proj.contacts.config.LogUtil;
import org.an.proj.contacts.ui.base.BaseWebViewActivity;

public class WebViewActivity extends BaseWebViewActivity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override protected String initCurrUrl() {
    //return "file:///android_asset" + "/web/test.html";
    return "http://bj.lianjia.com/";
  }

  @Override protected void setContentView() {
    setContentView(R.layout.activity_webview);
    setTitle("娱乐一下");
  }

  /**
   * 如果要自己定义，必须调用下面方法
   * mProgressBar.setProgress(newProgress);
   */
  protected WebChromeClient initWebChromeClient() {
    return new WebChromeClient() { // 处理进度
      public void onProgressChanged(WebView view, int newProgress) {
        WebViewActivity.this.onProgressChanged(view, newProgress);
      }

      @Override public void onReceivedTitle(WebView view, String title) {
        LogUtil.d(TAG, "onReceivedTitle: title=" + title);
      }

      /**
       * Tell the client to display a javascript alert dialog.  If the client
       * returns true, WebView will assume that the client will handle the
       * dialog.  If the client returns false, it will continue execution.
       */
      @Override public boolean onJsAlert(WebView view, String url, String message,
          final JsResult result) {
        /*这句话非常重要，它表示向WebView通知操作结果，JsResult有两个函数：
        JsResult.confirm()和JsResult.cancel()，JsResult.confirm()表示点击了弹出框的确定按钮，
        JsResult.cancel()则表示点击了弹出框的取消按钮。
        如果没有使用JsResult来告诉WebView处理结果，
        则WebView就会认为这个弹出框还一直弹在那里，你再点击alert按钮，将会无效*/
        result.confirm();
        final MaterialDialog dialog = new MaterialDialog(mContext);
        dialog.setCanceledOnTouchOutside(true)
            .setMessage(message)
            .setPositiveButton("知道了", new View.OnClickListener() {
              @Override public void onClick(View v) {
                dialog.dismiss();
              }
            })
            .show();
        // 表示告诉WebView我们已经拦截了alert()函数，不需要再弹出网页中的alert弹出框了，
        // 如果我们return false,那么WebView就会认为我们没有拦截alert()函数，会继续弹出alert对话框。
        return true;
      }
    };
  }

  @Override protected void registerJS() {
    // 注入的对象JSInterface的引用jsBridge
    // 我们已经把对象传给了JS，在JS中当然可以通过反射得到APP中的各种类的实例
    addJavascriptInterface(new MyJsBridge(), "jsBridge");
  }

  class MyJsBridge extends JsBridge {
    @JavascriptInterface @Override public void toast() {
      toast("js调用Android方法: 子类重写的方法");
    }
  }

  /**
   * 定义一个js与Android交互的类，包含一个方法toast（这个方法是js中定义的，jsBridge为对象的引用，需要注册）
   * <button onclick="jsBridge.toast()">点击我调用android 方法</button>
   */
  /*final*/ class JsBridge {

    /**
     * 为了解决addJavascriptInterface()函数的安全问题，在android:targetSdkVersion数值为17（Android4.2）及以上的APP中，
     * JS只能访问带有 @JavascriptInterface注解的Java函数，所以如果你的android:targetSdkVersion是17+，
     * 与JS交互的Native函数中，必须添加JavascriptInterface注解，不然无效
     */
    @JavascriptInterface public void toast() {
      toast("js调用Android方法");
    }

    /**
     * 与js中的方法名保持一致
     */
    @JavascriptInterface public void toast(String s) {
      ToastUtil.toast(mContext, s);
    }

    @JavascriptInterface public void setTitle(final String title) {
      // 需要加runOnUiThread
      runOnUiThread(new Runnable() {
        @Override public void run() {
          WebViewActivity.this.setTitle(title);
        }
      });
    }
  }
}
